package enemies.strategy.concretes;

import java.util.Iterator;

import mapControl.Celda;
import mapControl.MapControl;
import net.datastructures.NodePositionList;
import net.datastructures.Vertex;
import ED.GraphImp;

import com.jme.math.Quaternion;
import com.jme.math.Vector3f;

import enemies.Enemy;
import enemies.strategy.Strategy;
/**
 * Clase que modela la estrategia "Low" (la menos efectiva)
 * @author Sebastian Giulietti 69032 
 * @author Adrian Sanchez 64251
 * 
 */

public class ConcreteStrategyLow implements Strategy {
	
	//Lista que contiene el camino hasta bomberman
	private NodePositionList<Vertex<Celda>> camino;

	//Enemigo que usa la estrategia actual
	private Enemy enemy;
	
	//Grafo que modelara el tablero
	private GraphImp<Celda, Integer> grafo;
	private Iterator<Vertex<Celda>> it;

	//Arreglo de celdas que representaran el tablero
	private Vertex<Celda>[][] mapaGrapho;
	
	//objeto buscador de caminos
	private FindPathDFS<Celda, Integer> pathFinder;
	
	Quaternion rot;


	/**Contructor principal
	 * @param mapcontrol
	 * @param enemy
	 */
	public ConcreteStrategyLow(MapControl mapcontrol, Enemy enemy) {
		this.enemy = enemy;
		grafo = mapcontrol.getGraph();
		mapaGrapho = mapcontrol.getMapg();
		pathFinder = new FindPathDFS<Celda, Integer>(grafo);
		rot = enemy.getNode().getLocalRotation();
		update();
	}

	@Override
	//Metodo que ejecuta la estrategia
	public boolean execute() {
		if (it != null && it.hasNext()) {
			Vertex<Celda> myVertex = it.next();
			int lastRow = enemy.getRow();
			int lastCol = enemy.getCol();
			int row = myVertex.element().getRow();
			int col = myVertex.element().getCol();
			if (row == lastRow + 1) {
				rot.lookAt(new Vector3f(1, 0, 0), new Vector3f(0, 1, 0));
			} else if (row == lastRow - 1) {
				rot.lookAt(new Vector3f(-1, 0, 0), new Vector3f(0, 1, 0));
			} else if (col == lastCol + 1) {
				rot.lookAt(new Vector3f(0, 0, 1), new Vector3f(0, 1, 0));
			} else if (col == lastCol - 1) {
				rot.lookAt(new Vector3f(0, 0, -1), new Vector3f(0, 1, 0));
			}
			if (mapaGrapho[row][col].element().getBomba() != null) {
				row = lastRow;
				col = lastCol;
				update();
			} else
				enemy.moverA(row, col);
		} else {
			update();
		}
		return true;

	}
	
	
	/**
	 * actualiza el camino  
	 */
	private void update() {
		camino = pathFinder.obtenerCamino(mapaGrapho[enemy.getRow()][enemy
				.getCol()]);
		if (camino != null)
			it = camino.iterator();
	}

}